import DEFINE = require('./../../common/DEFINE');
import GCJ_CLASS_TYPE = require('./../../common/GCJ_CLASS_TYPE');
import CommonModel = require('./../../common/model/CommonModel');
import Serializer = require('./../base/Serializer');
import Parser = require('./../base/Parser');
import SJGReplaceItemBase = require('./SJGReplaceItemBase');
import PointPath = require('./../../common/graph/PointPath');
import SJGReplaceGroupAdvance = require('./SJGReplaceGroupAdvance');
var CONFIG=require('../../../../common/config');
export  = SJGReplaceGroup;

/**
 *
 * @author 
 *
 */
/**
 
ReplaceGroupObj（内核对象） 与SJGReplaceGroup（可替换对象）的id对应关系
 1）对于标题/副标题：
    SJGReplaceGroup(kind为1 titleGroup)  
        ｜
        ｜－－－SJGReplaceItemText (type为：10表示标题/11表示副标题)
            
    
    内核中：
        root             
         |                       
         |-----------------TextExtObj
        
 2）对于文字编组［废弃］：    
    SJGReplaceGroup(kind为2 textGroup)
        |
        |
        |----------SJGReplaceItemText(type为：20表示普通文字组)
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------TextObj
                    
 3）对于图片编组：    
    SJGReplaceGroup(kind为3 imageGroup)
        |
        |
        |----------SJGReplaceItemImage(type为：30表示普通图片组的图片)
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------ImageObj
                    
 4）对于图表编组：    
    SJGReplaceGroup(kind为4 chartGroup)
        |
        |
        |----------SJGReplaceItemChart(type为：40折线图／41柱状图／42饼状图)
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------ChartObj(type为：40折线图／41柱状图／42饼状图)
                        
                    
 5）对于表格编组：    
    SJGReplaceGroup(kind为5 tableGroup)
        |
        |
        |----------SJGReplaceItemTable(type为：50表示普通表格)
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------TableObj
                    
 6）对于旧的图文编组［废弃］：    
    SJGReplaceGroup(kind为6 6imageTextGroup)
        |
        |
        |----------SJGReplaceImageText(type为：60表示［旧版本］图文中间组)
                      |
                      |-----------SJGReplaceItemImage    
                      |-----------SJGReplaceItemText
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------ImageObj 
                    |-----------TextObj
        
 7）对于新型文字编组：    
    SJGReplaceGroup(kind为7 textGroup2)
        |
        |-------SJGSubGroupText(type为：80表示新型文字中间组)
                    |
                    |----------SJGReplaceItemTitleText(通过tt为0表示普通正文，type为：70表示正文／小标题，)
                    |----------SJGReplaceItemTitleText(通过tt为1表示小标题，type为：70表示正文／小标题，)    
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------TextExtObj (属性中含有小标题title)   
                        
                        
 8）对于新型图文编组：    
    SJGReplaceGroup(kind为8 ImageTextGroup2)
        |
        |
        |-------SJGSubGroupImageText(type为：90表示新型图文中间组)
                    |-------SJGReplaceItemImage(type为 30表示普通图片组)
                    |-------SJGSubGroupText(type为：80表示新型文字中间组)
                                |
                                |----------SJGReplaceItemTitleText(通过tt为0表示普通正文，type为：70表示正文／小标题，)
                                |----------SJGReplaceItemTitleText(通过tt为1表示小标题，type为：70表示正文／小标题，)    
                        
    内核中：
        ReplaceGroupObj
          |
          |-------GroupObj
                    |
                    |-----------ImageObj    
                    |-----------TextExtObj (属性中含有小标题title)   
                        
                        
 9）对于备注组：
    SJGReplaceGroup(kind为9 commentGroup)  
        ｜
        ｜－－－SJGReplaceItemText (type为：12表示备注)
            
    
    内核中：
        root             
         |                       
         |-----------------TextExtObj
 */ 


class SJGReplaceGroup extends Serializer{
    //0bbox/1outline
    public static BBOX=0;
    public static OUTLINE=1;
    
    // 扩展方式：
    //0水平扩展
    //1垂直扩展
    //2圆形扩展
    //3矩形对角线扩展 
    //4W形扩展
    //5按路径扩展
    public static HORIZON=0;
    public static VERTICLE=1;
    public static CIRCLE=2;
    public static RECT=3;// 矩形对角线扩展 
    public static W=4;
    public static PATH=5;
    
    // 1titleGroup/2textGroup/3imageGroup/4chartGroup/5tableGroup/6imageTextGroup/7textGroup2/8ImageTextGroup2/9CommentGroup
    public static TITLEGROUP=1;
    public static TEXTGROUP=2; //[废弃]
    public static IMAGEGROUP=3;
    public static CHARTGROUP=4;
    public static TABLEGROUP=5;
    public static IMAGETEXTGROUP=6; //[废弃]
    public static TEXTGROUP2 = 7;
    public static IMAGETEXTGROUP2 = 8;
    public static COMMENTGROUP=9;
    public static GRAPHGROUP=10;
    
    // replace对象标记位
    public static TAG_NONE=0
    public static TAG_TITLE=1;
    public static TAG_SUB_TITLE=2;
    public static TAG_COMMENT=4;
    public static TAG_TEXT=8;
    public static TAG_IMAGE=16;
    public static TAG_IMG_TXT=32;
    public static TAG_CHART=64;
    public static TAG_TABLE=128;
    public static TAG_GRAPH=256;
    
    
    // 对齐点［暂时未使用］
    /*
    7-----0-----1
    |           |
    6     8     2
    |           |
    5-----4-----3
    * */
    public static ALIGN_POINT_0=0;
    public static ALIGN_POINT_1=1;
    public static ALIGN_POINT_2=2;
    public static ALIGN_POINT_3=3;
    public static ALIGN_POINT_4=4;
    public static ALIGN_POINT_5=5;
    public static ALIGN_POINT_6=6;
    public static ALIGN_POINT_7=7;
    public static ALIGN_POINT_8=8;
    
    
    
    // 基本属性
    public kind: number=SJGReplaceGroup.TITLEGROUP;// 编组种类
    public min: number=1;// // 最小个数
    public max: number=1;// 最大个数
    public id:number = DEFINE.ID_NONE; // 组对象的id
    public value: Array<SJGReplaceItemBase>=new Array<SJGReplaceItemBase>(); //  数组内容
    
    // 高级属性
    public advance: SJGReplaceGroupAdvance=new SJGReplaceGroupAdvance();
    
    
    public constructor(g?) {
        super(g);
                
        this.ct = GCJ_CLASS_TYPE.CLASS_TYPE_SJGReplaceGroup;
	}
	
    // 从json对象(注意不是json字符串)中解析
    public fromJson(jsonObj, versionId) { 
        super.fromJson(jsonObj,versionId);
                
        this.kind = jsonObj.kind;
        this.min = jsonObj.min;
        this.max = jsonObj.max;
        this.id = jsonObj.id;
        
        this.value.splice(0, this.value.length);
        if (jsonObj.hasOwnProperty('value')) {
            for (var i = 0;i < jsonObj.value.length;i++) {
                var item:SJGReplaceItemBase = Parser.fromUnknownJson(jsonObj.value[i],versionId,this.getGlobalData());
                this.value.push(item);
            }
        }
        
        if (jsonObj.advance != null) {
            this.advance.fromJson(jsonObj.advance, versionId);
        }
        
//        this.advance.extend_style=jsonObj.extend_style;
//        this.advance.extend_method=jsonObj.extend_method;
//        if(jsonObj.extend_path!=null){ 
//            this.advance.extend_path=new PointPath();
//            this.advance.extend_path.fromJson(jsonObj.extend_path,versionId);
//        }
//        this.advance.align_point=jsonObj.align_point;
//        this.advance.header_type=jsonObj.header_type;
//        this.advance.limit=jsonObj.advance.limit;
//        this.advance.count=jsonObj.advance.count;
        
        // 加载文档时
        if (this.getGlobalData().docStatus() == DEFINE.DOC_STATUS_LOADING) {
            this.getGlobalData().objManager().saveReplaceGroupObject(this);
        }
    }
    
    // 转成json字符串
    public toJson():string {                                                                      
        // 去掉父json字符串的头尾
        var superJson = super.toJson();
        superJson = superJson.substr(1,superJson.length-2);
                                                                
        var ret = '{';
        ret +=superJson;  
        
        // kind
        ret +=',';
        ret += '"kind":';
        ret += this.kind;
        
        // min
        ret += ',';
        ret += '"min":';
        ret += this.min;
        
        // max
        ret += ',';
        ret += '"max":';
        ret += this.max;
                    
        // id
        ret +=',';
        ret += '"id":';
        ret += this.id;
        
        // value
        ret += ',';
        ret += '"value":[';
        for (var i = 0; i < this.value.length; i++) {
            if (i > 0) {
                ret += ',';
            }
            ret += this.value[i].toJson();
        }
        ret += ']',
        
        // advance
        ret += ',';
        ret += '"advance":' + this.advance.toJson();
        
//        // extend_style
//        ret +=',';
//        ret += '"extend_style":';
//        ret += this.advance.extend_style;
//        
//        // extend_method
//        ret +=',';
//        ret += '"extend_method":';
//        ret += this.advance.extend_method;
//        
//        
//        // extend_path
//        if(this.advance.extend_path!=null){
//            ret +=',';
//            ret += '"extend_path":';
//            ret+=this.advance.extend_path.toJson();
//        }
//        
//        // align_point
//        ret +=',';
//        ret += '"align_point":';
//        ret += this.advance.align_point;
//        
//        // header_type
//        ret +=',';
//        ret += '"header_type":';
//        ret += this.advance.header_type;  
//        
//        // limit
//        ret +=',';
//        ret += '"limit":';
//        ret += this.advance.limit;  
//        
//        // count
//        ret +=',';
//        ret += '"count":';
//        ret += this.advance.count;  
                                                                                                                                        
        ret+='}';
        return ret;
    }  
    public getKindName():string{
        // 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
        return this.kind==SJGReplaceGroup.TITLEGROUP? "标题编组":(
            this.kind==SJGReplaceGroup.COMMENTGROUP? "备注编组":(
            this.kind==SJGReplaceGroup.TEXTGROUP? "文字编组":(
            this.kind==SJGReplaceGroup.IMAGEGROUP? "图片编组":(
            this.kind==SJGReplaceGroup.CHARTGROUP? "图表编组":(
            this.kind==SJGReplaceGroup.TABLEGROUP? "表格编组":(
            this.kind==SJGReplaceGroup.IMAGETEXTGROUP? "图文编组":(
            this.kind == SJGReplaceGroup.TEXTGROUP2 ? "文字编组2" : (
            this.kind == SJGReplaceGroup.IMAGETEXTGROUP2 ? "图文编组2" : ("")))))))));
    }
    public getShowInfo():string{
        var cnt = '[Min:' + this.min + ', Max:' + this.max +'] ';
        
        return this.getKindName() + ": " + cnt + this.advance.getShowInfo();
    }
    // 转换成CommonModel树
    public toCommonModel(level: number): CommonModel {
        var ret: CommonModel=CommonModel.from(this.id,this.getKindName(),CommonModel.SPREAD_EXPAND,level,false);

        for(var i=0;i<this.value.length;i++) {
            var r: SJGReplaceItemBase=this.value[i];
            var s: CommonModel=r.toCommonModel(level+1);
            ret.addChild(s);
        }
        return ret;

    }
    
    // 修改“可替换item”的id
    // 参数：oldId，旧id
    // 参数：newId，新id
    // 参数：updateOnce［可选］，true表示只发生一次替换
    public updateReplaceItemId(oldId,newId,updateOnce?:Boolean):Boolean {
        // 先处理子，再处理自身
        for(var i=0;i<this.value.length;i++) {
            var r: SJGReplaceItemBase=this.value[i];
            if(r.updateReplaceItemId(oldId,newId,updateOnce)){
                return true;
            }
            
        }
        if(this.id==oldId) {
            // 检测是否只进行一次替换
            var PACKER: any=this;
            if(updateOnce&&PACKER.updated) {
                return false;
            }
            PACKER.updated=true;
            
            // 发生更新
            this.id=newId;
            return true;
        }
        return false;
    }
//SJG_MARK_APPEND--------------------

    public isContentEmpty():boolean{
        if(this.value==null || this.value.length==0){
            return true;
        }
        var allEmpty:boolean = true;
        for (var i = 0;i < this.value.length;i++) {
            var item:SJGReplaceItemBase = this.value[i];
            if(!item.isContentEmpty()){
                allEmpty = false;
                break;
            }
        }
        return allEmpty;
    }

}//SJG_MARK_END-------------------------
